﻿// ***********************************************************************
// Apache 2.0 License
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 
//
// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY 
// IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR 
// PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
//
// See the Apache Version 2.0 License for specific language governing
// permissions and limitations under the License.
// ***********************************************************************
// Assembly  : ContractMeow.Api.Dtos
// File      : Message.cs
//
// ***********************************************************************
using ContractMeow.Api.Dtos.Attachment;
using ContractMeow.Api.Dtos.Serialization;
using Newtonsoft.Json;
using System;

namespace ContractMeow.Api.Dtos.Message
{
	/// <summary>
	/// Class Message
	/// </summary>
	public sealed class Message
	{
		/// <summary>
		/// Gets or sets the id.
		/// </summary>
		/// <value>The id.</value>
		[JsonProperty("id")]
		public Int64 Id { get; set; }
		/// <summary>
		/// Gets or sets the thread id.
		/// </summary>
		/// <value>The thread id.</value>
		[JsonProperty("thread_id")]
		public Int64 ThreadId { get; set; }
		/// <summary>
		/// Gets or sets the replied to id.
		/// </summary>
		/// <value>The replied to id.</value>
		[JsonProperty("replied_to_id")]
		public Int64? RepliedToId { get; set; }
		/// <summary>
		/// Gets or sets the group id.
		/// </summary>
		/// <value>The group id.</value>
		[JsonProperty("group_id")]
		public Int64 GroupId { get; set; }

		/// <summary>
		/// Gets or sets the type of the message.
		/// </summary>
		/// <value>The type of the message.</value>
		[JsonProperty("message_type")]
		public String MessageType { get; set; }
		/// <summary>
		/// Gets or sets the is system message.
		/// </summary>
		/// <value>The is system message.</value>
		[JsonProperty("system_message")]
		public Boolean IsSystemMessage { get; set; }

		/// <summary>
		/// Gets or sets the sender id.
		/// </summary>
		/// <value>The sender id.</value>
		[JsonProperty("sender_id")]
		public Int64 SenderId { get; set; }
		/// <summary>
		/// Gets or sets the type of the sender.
		/// </summary>
		/// <value>The type of the sender.</value>
		[JsonProperty("sender_type")]
		public String SenderType { get; set; }

		/// <summary>
		/// Gets or sets the network id.
		/// </summary>
		/// <value>The network id.</value>
		[JsonProperty("network_id")]
		public Int64 NetworkId { get; set; }

		/// <summary>
		/// Gets or sets the web URL.
		/// </summary>
		/// <value>The web URL.</value>
		[JsonProperty("web_url")]
		public Uri WebUrl { get; set; }
		/// <summary>
		/// Gets or sets the URL.
		/// </summary>
		/// <value>The URL.</value>
		[JsonProperty("url")]
		public Uri Url { get; set; }

		/// <summary>
		/// Gets or sets the created at.
		/// </summary>
		/// <value>The created at.</value>
		[JsonProperty("created_at")]
		public DateTime CreatedAt { get; set; }

		/// <summary>
		/// Gets or sets the body.
		/// </summary>
		/// <value>The body.</value>
		[JsonProperty("body")]
		public Body Body { get; set; }

		/// <summary>
		/// Gets or sets the client URL.
		/// </summary>
		/// <value>The client URL.</value>
		[JsonProperty("client_url")]
		public Uri ClientUrl { get; set; }
		/// <summary>
		/// Gets or sets the is public.
		/// </summary>
		/// <value>The is public.</value>
		[JsonProperty("privacy")]
		[JsonConverter(typeof(PrivacyJsonConverter))]
		public Boolean IsPublic { get; set; }
		/// <summary>
		/// Gets or sets the type of the client.
		/// </summary>
		/// <value>The type of the client.</value>
		[JsonProperty("client_type")]
		public String ClientType { get; set; }

		/// <summary>
		/// Gets or sets the is direct message.
		/// </summary>
		/// <value>The is direct message.</value>
		[JsonProperty("direct_message")]
		public Boolean IsDirectMessage { get; set; }

		/// <summary>
		/// Gets or sets the attachments.
		/// </summary>
		/// <value>The attachments.</value>
		[JsonProperty("attachments")]
		[JsonConverter(typeof(AttachmentJsonConverter))]
		public IAttachment[] Attachments { get; set; }
		/// <summary>
		/// Gets or sets the liked by.
		/// </summary>
		/// <value>The liked by.</value>
		[JsonProperty("liked_by")]
		public LikedBy LikedBy { get; set; }

		[JsonProperty("title")]
		public string Title { get; set; }
	}
}